package com.it.design.withDecoratorDesign;
/*
 * 装饰者设计模式（静态代理）
 * */
public class WithDecoratorDesign {
    /*
    * 现在的目的是相对当前吃香蕉这个方法进行增强
    * 如果要使用装饰者设计模式，那么这个增强类要和原始目标类实现同一个接口
    * 他还要缓存原始目标对象
    * 现在使用了装饰者设计模式，确实对原始目标类进行了增强，但是对原有的代码逻辑没有任何的修改，
    * 也没有重写一遍原有逻辑，利用设计模式就对原有代码进行了增强
    * 装饰者设计模式在IO流中大量被使用
    * new BufferedReader(new FileReader(new File("")));
    * new BufferedInputStream(new FileInputStream(new File("")));
    * 最开始这个file 他只是具备一定api的字符串映射
    * fileReader 对file进行装饰者增强 让file具备了一些读的功能
    * bufferedReader 又对fileReader进行增强 让其具备整行读写的能力
    * Spring的 aop 也是一种装饰者设计模式的实现(动态代理)
    * 动态代理的底层就是静态代理 只不过这个动态代理的代码，不用你去书写，
    * 而是框架他替你利用反射生成了一套和静态代理一模一样的代码，然后框架替你去把这个代码进行编译，
    * 加载内存、在运行删除、所以从程序员而言并没有写过任何的静态代理代码，
    *
    * 所以静态代理是有程序员自己实现装饰者代码去进行功能的增强
    * 动态代理由程序利用配置文件，和反射去自动生成功能增强的代码
    *
     * */
    public static void main(String[] args) {
      ConcreateComponent component=new ConcreateComponent();
      Decorator decorator=new Decorator(component);
      decorator.execute();
    }
    public interface Component {
        public void execute();
    }

    public static class ConcreateComponent implements Component {
        @Override
        public void execute() {
            System.out.println("我爱吃香蕉");
        }
    }

    //要实现装饰者设计模式必须要和业务代码实现同一个接口
    public static class Decorator implements Component {
        private ConcreateComponent concreateComponent;
        public Decorator(ConcreateComponent concreateComponent) {
            this.concreateComponent = concreateComponent;
        }
        @Override
        public void execute() {
            System.out.println("先洗手");
            concreateComponent.execute();
            System.out.println("要刷牙");
        }
    }
}
